// 定义处理具体模块的中间件
//从express导入几个对象
import { Request, Response, NextFunction } from 'express';

// 导入bcrypt包
import bcrypt from 'bcrypt';

//导出user.servic里的全部内容
import * as userService from './user.service';

// 验证用户数据 （非空验证）
export const validataUserData = async (
  req: Request,
  res: Response,
  next: NextFunction
) => {
  // 测试是否用到这个中间件
  // console.log('验证用户数据');
  // 数据
  const {name,password} = req.body;
  // 验证必填数据 没有用户名交给全局错误处理中间件
  if(!name) return next(new Error('USERNAME_NOT_FOUND'));
  if(!password) return next(new Error('PASSWORD_NOT_FOUND'));

  // 验证用户名
  const user = await userService.getUserByName(name);
  if(user) return next(new Error('USER_ALREADY_EXISTS'));

  // 下一步处理
  next();
}


// 密码加密 npm install bcrypt / 安装这个包需要编译 安装类型定义 npm install @types/bcrypt --save-dev
// 导入加密的包bcrypt[向上]
export const hashPassword = async (
  req: Request,
  res: Response,
  next: NextFunction
) => {
  // 接收请求密码
  const {password} = req.body;
  // 重新赋值程hash值               hash 方法     第二个参数为salt 加密程度，类型必须是Number 
  req.body.password = await bcrypt.hash(password,10);
  next();
  //导出的中间件对象要在路由中导入
}


//导出到user.router.ts路由
//到全局错误处理加入这两个错误单独的提示
